
package com.udc.medLine.factory;

import java.util.List;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Restrictions;

import com.udc.medLine.entity.Cliente;
import com.udc.medLine.entity.CondicaoVO;
import com.udc.medLine.entity.Conveniencia;
import com.udc.medLine.exception.BaseException;
import com.udc.medLine.exception.CampoDuplicadoException;
import com.udc.medLine.persistence.ConvenienciaDAO;

public class FactoryConveniencia {

	private ConvenienciaDAO convenienciaDAO;

	/**
	 * 
	 */
	public FactoryConveniencia() {
		super();
		convenienciaDAO = new ConvenienciaDAO();
		// TODO Stub de construtor gerado automaticamente
	}

	public Conveniencia getConveniencia() {
		return (convenienciaDAO.getConveniencia());
	}

	public void setConveniencia(Conveniencia new_conveniencia) {
		this.convenienciaDAO.setConveniencia(new_conveniencia);
	}

	public void insert() throws Exception {

		int size = convenienciaDAO.search(
				"From conveniencia in class Conveniencia WHERE conveniencia.nome = '"
						+ convenienciaDAO.getConveniencia().getNome()+"'").size();

		if (size > 0) {
			throw new CampoDuplicadoException("nome");
		}
		convenienciaDAO.insert();
	}

	public void delete() throws Exception {
		int size = convenienciaDAO.search(
				"From conveniencia in class Conveniencia ,Item as i WHERE i.conveniencia.id = "
						+ convenienciaDAO.getConveniencia().getId()).size();
		if (size > 0) {
			throw new BaseException("referencia");
		}
		convenienciaDAO.delete();
	}

	public void update() throws Exception {
		Integer size = (Integer)convenienciaDAO.getUniqueResult(
				"select count(*) from conveniencia in class Conveniencia WHERE conveniencia.nome = '"
						+ convenienciaDAO.getConveniencia().getNome() + "' and conveniencia.id != "
						+ convenienciaDAO.getConveniencia().getId());
		if (size > 0){
			throw new CampoDuplicadoException("nome");
		}
		convenienciaDAO.update();
	}

	public List getConveniencia(String campo, String valor){
		List lista;
		try {
			lista = convenienciaDAO.search("From conveniencia in class Conveniencia WHERE "+campo+" ='"+ valor + "'");
		}
		catch (Exception e){
			return null;
		}
		return lista;
	}
	
	public List getListaConveniencia(){		
		List lista;	
		try{		
			lista = convenienciaDAO.search("From conveniencia in class Conveniencia");
		}
		catch (Exception e){
		 	return null;
		}
		return lista;		
	}
	
	public Conveniencia obterConveniencia() throws Exception {
		return convenienciaDAO.retrive();
	}
	
	public List search(CondicaoVO condicao) throws Exception {
		String hql;
		String campoSQL = null;
		String operadorSQL = null;
		String valorSQL = " ";
		valorSQL = "'" + condicao.getValor() + "'";
		
		if (condicao.getValor().equals("")){
			hql = "From conveniencia in class Conveniencia";
		}else {
			hql = "From conveniencia in class Conveniencia WHERE ";
		if (condicao.getCampo().equals("id")) {
			valorSQL = condicao.getValor();
			campoSQL = " id ";
			if (condicao.getOperador().equals("contem")) {
				condicao.setOperador("igual");				
			}
		} else if (condicao.getCampo().equals("nome")) {
			campoSQL = " nome ";
		}
	    else if (condicao.getCampo().equals("modelo")) {
			campoSQL = " modelo.nome ";
		}
	    
	    else if (condicao.getCampo().equals("categoria")) {
			campoSQL = " categoria.nome ";
		}
	 
	    else if (condicao.getCampo().equals("qtdminima")) {
			valorSQL = condicao.getValor() ;
	    	campoSQL = " quantidadeMinima ";
		
	    }
		
	    else if (condicao.getCampo().equals("dataVencimento")) {
	       	campoSQL = " dataVencimento ";
		}

		
		if (condicao.getOperador().equals("igual")) {
			operadorSQL = "=";
		} else if (condicao.getOperador().equals("diferente")) {
			operadorSQL = "!=";
		} else if (condicao.getOperador().equals("maior")) {
			operadorSQL = ">";
		} else if (condicao.getOperador().equals("menor")) {
			operadorSQL = "<";
		} else if (condicao.getOperador().equals("contem")) {
			operadorSQL = "like";
			valorSQL = "('%" + condicao.getValor() + "%')";
		}
		hql += campoSQL + " " + operadorSQL + valorSQL;
	  }
		
		return  convenienciaDAO.search(hql);	
	}

	public List search(List condicoes) throws Exception {
		String hql = "From conveniencia in class Conveniencia";
		if (condicoes.size() > 0) {
			hql += " where ";
		}

		for (int i = 0; i < condicoes.size(); i++) {

			CondicaoVO condicao = (CondicaoVO) condicoes.get(i);

			if (condicao.getCampo().equals("produto")) {

				hql += " conveniencia.nome ";
			} else if (condicao.getCampo().equals("marca")) {

				hql += " conveniencia.modelo.marca.nome";
			} else if (condicao.getCampo().equals("modelo")) {

				hql += " conveniencia.modelo.nome";
			} else if (condicao.getCampo().equals("categoria")) {

				hql += " conveniencia.categoria.nome";
			}

			hql += " like ";

			hql += "('%" + condicao.getValor() + "%')";
			if (i < condicoes.size() - 1) {

				hql += " and ";

			}
		}

		return convenienciaDAO.search(hql);	
	}

}
